package controlador.comer;

//
import java.util.ArrayList;
import java.util.List;
import modelo.TipoTelefono;
import modelo.Telefono;
import modelo.ContactoResponsable;

import modelo.EmpresaCliente;
import modelo.Planta;
import modelo.ContactoResponsable;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import util.HibernateUtil;
import vista.comer.pantallaRegistrarContactoResponsable;
//import controlador.utiles.gestorGeoLocalicacion;
import controlador.utiles.gestorBDvarios;
import util.Tupla;
import java.util.Date;
import java.util.Iterator;
import modelo.RolContactoResponsable;
//import java.util.Set;
//
//  Generated by StarUML(tm) Java Add-In
//
//  @ Project : Proyecto2010_Requerimientos-iuga
//  @ File Name : GestorModificarNuevoEmpleado.java
//  @ Date : 10/08/2010
//  @ Author : Fran
//
//

public class GestorModificarContactoResponsable implements IGestorContactoResponsable {

    private pantallaRegistrarContactoResponsable pantalla;
    private String nombreContactoResponsable;
    private String apellidoContactoResponsable;
    private String emailContactoResponsable;
    private String cuilContactoResponsable;
    private RolContactoResponsable rolContactoResponsable;
    private ArrayList<String> listaNroTel;
    private ArrayList<TipoTelefono> listaTipoTel;
    private Date fechaActual;
    private EmpresaCliente empresaCliente;
    private Planta planta;
    private ContactoResponsable contactoModif;
    private String cuilContactoOriginal;
    private int idContactoOriginal;

    public GestorModificarContactoResponsable(pantallaRegistrarContactoResponsable pantalla, int id) {
        this.pantalla = pantalla;

        listaNroTel = new ArrayList<String>();
        listaTipoTel = new ArrayList<TipoTelefono>();
        idContactoOriginal = id;


    }

    public boolean ValidarCuil(String cuil) {
        SessionFactory sf = HibernateUtil.getSessionFactory();
        Session sesion = sf.openSession();
        List listCuil = new ArrayList();
        boolean aprobado = true;
        listCuil = sesion.createQuery("Select cuil from modelo.ContactoResponsable").list();//
        String n;
        for (int i = 0; i < listCuil.size(); i++) {
            n = (String) listCuil.get(i);
            if (n != null && n.equals(cuil)) {
                aprobado = false;
                if (cuilContactoOriginal.equals(cuil)) {
                    aprobado = true;
                    break;
                }
            }
        }
        return aprobado;
    }

    @Override
    public ArrayList<Tupla> mostrarTiposDeTelefono() {
        gestorBDvarios bdv = new gestorBDvarios();
        return bdv.getTiposDeTelefono();
    }

    @Override
    public ArrayList<Tupla> mostrarPlantas(int idEmpresa) {
        gestorBDvarios bdv = new gestorBDvarios();
        return bdv.getPlantas(idEmpresa);
    }

    @Override
    public ArrayList<Tupla> mostrarEmpresas() {
        gestorBDvarios bdv = new gestorBDvarios();
        return bdv.getEmpresas();
    }

    public boolean levantarContacto(int id) {
        Session sesion;
        try {
            sesion = HibernateUtil.getSession();
            HibernateUtil.beginTransaction();
            contactoModif = (ContactoResponsable) sesion.createQuery("from ContactoResponsable where id =" + id).uniqueResult();
            HibernateUtil.commitTransaction();
        } catch (Exception ex) {
            System.out.println("Error levantando el empleado");
            HibernateUtil.rollbackTransaction();
            return false;
        }
        
        //Envio a la pantalla los datos personales del empleado levantado
        pantalla.datosPersonalesContacto(contactoModif.getCuil(),contactoModif.getNombre(), contactoModif.getApellido(),  contactoModif.getEmail(),contactoModif.getRol().getId());
        
        //Envio a la pantalla los telefonos del empleado levantado
        Telefono[] tel=(Telefono[])contactoModif.getTelefonos().toArray(new Telefono[0]);
        ArrayList listaNro = new ArrayList<String>();
        ArrayList listaTipoT = new ArrayList<Tupla>();
        for(int i=0; i<tel.length;i++)
        {
            TipoTelefono td= tel[i].getTipo();
            Tupla tup=new Tupla();
            tup.setId(td.getId());
            tup.setNombre(td.getNombre());
            listaTipoT.add(tup);
            listaNro.add(tel[i].getNumero());
        }
        pantalla.telefonosContacto(listaNro, listaTipoT);
        return true;
    }

    @Override
    public void datosPersonalesContactoResponsable(String cuil, String nombre, String apellido, String email, int idRol) {

        gestorBDvarios bdv = new gestorBDvarios();
        nombreContactoResponsable = nombre;
        apellidoContactoResponsable = apellido;
        emailContactoResponsable = email;
        cuilContactoResponsable = cuil;
        rolContactoResponsable = bdv.getRolContactoResponsable(idRol);

    }

    @Override
    public void datosPersonalesContactoResponsable(String cuil, String nombre, String apellido, String email, int idRol, Tupla empr, Tupla plant) {
        gestorBDvarios bdv = new gestorBDvarios();
        nombreContactoResponsable = nombre;
        apellidoContactoResponsable = apellido;
        emailContactoResponsable = email;
        cuilContactoResponsable = cuil;
        rolContactoResponsable = bdv.getRolContactoResponsable(idRol);
        empresaCliente = bdv.getEmpresa(empr.getId());
        List plnts = empresaCliente.getPlantas();
        boolean todoOK = false;
        for (int i = 0; i < plnts.size(); i++) {
            Planta p = (Planta) plnts.get(i);
            if (p.esPlanta(plant.getId())) {
                planta = p;
                todoOK = true;
            }
        }
        if (!todoOK) {
            System.out.println("/n ERROR IMPOSIBLE: PLANTA INEXISTENTE SELECCIONADA POR EL USUARIO /n");
        }
    }

    @Override
    public boolean validarPlantaSinContacto() {
        if (planta == null) {
            return true;
        } else {
            if (planta.getContacto() == null) {
                return true;
            } else {
                return false;
            }
        }
    }

    public boolean contactoModificado() {
        ContactoResponsable contacto;

        Session sesion;
        try {
            HibernateUtil.beginTransaction();
            sesion = HibernateUtil.getSession();
            
            Iterator ittv=contactoModif.getTelefonos().iterator();
            while(ittv.hasNext())
            {
                Telefono tel=(Telefono)ittv.next();
                sesion.delete(tel);
            }
            try {
//                contacto = modificarContacto();
                modificarContacto();
                if (planta != null) {
                    planta.setContacto(contactoModif);
                }

            } catch (Exception ex) {
                System.out.println("No se pudo crear el contacto responsable");
                return false;
            }

            // Guardo las modificaciones hechas sobre el contacto
            sesion.saveOrUpdate(contactoModif);
            
            // Guardo los cambios sobre la planta a la que pertenece, en el caso
            // que efectivamente pertenezca a una.
            if (planta != null) {
                sesion.saveOrUpdate(planta);
            }
            
            HibernateUtil.commitTransaction();
            return true;
        } catch (Exception e) {
            System.out.println("No se pudo realizar la transaccion\n" + e.getMessage());
            HibernateUtil.rollbackTransaction();
            return false;
        }
    }

    public void buscarUltimoLegajoEmpleado() {
    }

    public void vaciarDatos() {

        nombreContactoResponsable = null;
        apellidoContactoResponsable = null;
        emailContactoResponsable = null;
        cuilContactoResponsable = null;
        rolContactoResponsable = null;
        listaNroTel = new ArrayList<String>();
        listaTipoTel = new ArrayList<TipoTelefono>();
        empresaCliente = null;
        planta = null;

    }

    public void modificarContacto() {
        contactoModif.setNombre(apellidoContactoResponsable + ", " + nombreContactoResponsable);
        contactoModif.setCuil(cuilContactoResponsable);
        contactoModif.setEmail(emailContactoResponsable);
        contactoModif.setRol(rolContactoResponsable);
        
        List<Telefono> telefonos = new ArrayList<Telefono>();
        for(int i=0; i<listaNroTel.size();i++)
        {
            TipoTelefono tipoTelefono = (TipoTelefono) listaTipoTel.get(i);
            Telefono telefono = new Telefono(listaNroTel.get(i), tipoTelefono);
            telefonos.add(telefono);
        }
        contactoModif.setTelefonos(telefonos);
    }

    @Override
    public void telefonosContactoResponsable(ArrayList<String> numero, ArrayList<Tupla> tipo) {
        listaNroTel = numero;
        listaTipoTel = new ArrayList();
        gestorBDvarios bdv = new gestorBDvarios();
        for (int i = 0; i < tipo.size(); i++) {
            TipoTelefono td = bdv.getTipoDeTelefono(tipo.get(i).getId());
            listaTipoTel.add(td);
        }
    }

    public void finCU() {
    }

    public void seleccionTipoDocumento() {
    }

    public void documentoEmpleado() {
    }

    @Override
    public ArrayList<Tupla> mostrarRolesContactoResponsable() {
        gestorBDvarios bdv = new gestorBDvarios();
        return bdv.getRolesContactoResponsable();
    }
}
